package model;

// 导入ArrayList和List类，用于创建和管理学生列表
import java.util.ArrayList;
import java.util.List;

/**
 * 课程类
 * 包含课程基本信息和选课管理功能
 * 是学生选课系统中的核心实体类之一
 */
public class Course {
    // 私有属性 - 封装了课程的所有信息
    private String id;           // 课程编号
    private String name;         // 课程名称
    private String location;     // 上课地点
    private String time;         // 上课时间
    private int credit;          // 学分
    private int capacity;        // 课程容量
    private List<Student> students; // 选课学生列表
    private Teacher teacher;     // 授课教师
    
    /**
     * 构造方法
     * @param id 课程编号
     * @param name 课程名称
     * @param location 上课地点
     * @param time 上课时间
     * @param capacity 课程容量
     * 初始化课程的基本信息，学分默认为3学分
     * 创建空的学生列表，准备存储选课学生
     */
    public Course(String id, String name, String location, String time, int capacity) {
        this.id = id;            // 初始化课程编号
        this.name = name;        // 初始化课程名称
        this.location = location; // 初始化上课地点
        this.time = time;        // 初始化上课时间
        this.credit = 3;         // 默认3学分
        this.capacity = capacity; // 初始化课程容量
        this.students = new ArrayList<>(); // 初始化学生列表为空集合
    }
    
    /**
     * 添加选课学生
     * @param student 要添加的学生对象
     * @return boolean - 添加成功返回true，课程已满返回false
     * 检查课程是否还有空位，如果有则添加学生并返回true
     * 如果课程已满，则返回false
     */
    public boolean addStudent(Student student) {
        // 检查学生数量是否小于课程容量
        if (students.size() < capacity) {
            // 如果有容量，添加学生到列表
            students.add(student);
            return true; // 返回添加成功
        }
        // 课程已满，返回添加失败
        return false;
    }
    
    /**
     * 移除选课学生
     * @param student 要移除的学生对象
     * 从学生列表中移除指定的学生
     * 如果学生不在列表中，List的remove方法会安全返回，不会抛出异常
     */
    public void removeStudent(Student student) {
        students.remove(student);
    }
    
    /**
     * 设置授课教师
     * @param teacher 授课教师对象
     * 为课程分配一位授课教师
     */
    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }
    
    /**
     * 获取课程编号
     * @return 课程编号
     */
    public String getId() {
        return id;
    }
    
    /**
     * 获取课程名称
     * @return 课程名称
     */
    public String getName() {
        return name;
    }
    
    /**
     * 获取上课地点
     * @return 上课地点
     */
    public String getLocation() {
        return location;
    }
    
    /**
     * 获取上课时间
     * @return 上课时间
     */
    public String getTime() {
        return time;
    }
    
    /**
     * 获取学分
     * @return 学分
     */
    public int getCredit() {
        return credit;
    }
    
    /**
     * 获取课程容量
     * @return 课程容量
     */
    public int getCapacity() {
        return capacity;
    }
    
    /**
     * 获取选课学生列表
     * @return 选课学生的List集合
     */
    public List<Student> getStudents() {
        return students;
    }
    
    /**
     * 获取授课教师
     * @return 授课教师对象
     * 如果课程还没有分配教师，返回null
     */
    public Teacher getTeacher() {
        return teacher;
    }
    
    /**
     * 设置学分
     * @param credit 新的学分值
     * 允许修改课程的学分
     */
    public void setCredit(int credit) {
        this.credit = credit;
    }
}
